package pub.dsb.example.netty.discard;

import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;
import io.netty.util.ReferenceCountUtil;

/**
 * <p>
 * I/O 数据处理器
 * </p>
 *
 * @author Yi
 * @version V1.0.0
 * @date 2020/12/28 11:08
 * @modificationHistory=========================逻辑或功能性重大变更记录
 * @modify By: {修改人} 2020/12/28 11:08
 * @modify reason: {方法名}:{原因}
 * ...
 * @since V1.0.0
 */
public class DiscardServerHandler extends ChannelInboundHandlerAdapter {
    // [1]

    // [2]
    @Override
    public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
        // super.channelRead(ctx, msg);
        // 不处理消息，直接释放
        // [3]
        //((ByteBuf) msg).release();
        ByteBuf in = (ByteBuf) msg;
        try {
            // 针对消息 msg 进行处理
//            while (in.isReadable()) { // [4]
//                System.out.print((char) in.readByte());
//                System.out.flush();
//            }
            // 上面的循环等价于:
            System.out.println(in.toString(io.netty.util.CharsetUtil.US_ASCII));
        } finally {
            ReferenceCountUtil.release(msg);
        }
    }

    // [4]
    @Override
    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
        // super.exceptionCaught(ctx, cause);
        // 当异常发生的时候关闭连接
        cause.printStackTrace();
        ctx.close();
    }
}
